Simulateur Charges Salarié - John COLIBRI. Calcul Charges Sociales SAS |
- résumé : calculateur des charges sociales salariales pour directeur SAS (assimilé salarié)
- mots clé : charges sociales, SAS, Société par Actions Simplifié, cotisations sociales, maladie, allocations familiales, retraite,
complémentaire, csg, rds, csg crds non déductible, plafond sécurité sociale, 2020
- matériel utilisé : intel i3-8100, 3.6 gHz, 8GB memory, 128 G and 1 T hard disc
- logiciel utilisé : Windows 10 pro 64 bit, Delphi 7
- champ d'application : Delphi 1 à 7, 2006 à 2010, Xe_nnn, Seattle, Tokyo, Berlin, Delphi 10.3
- niveau : développeur Delphi
- plan :
1 - Charges Sociales SAS
Nous sommes actuellement (depuis 1980 !) en SARL. Pour comparer avec d'autres formes juridiques, nous souhaitions pouvoir comparer les diverses charges sociales. Cet article va donc permettre de calculer les charges sociales d'un directgeur
de SAS (Société par Actions Simplifié)
2 - Calcul des Charges salariales 2.1 - Les Paramètres
Nous avons placés les paramètres des charges dans un fichier .TXT. Ceci permet de faire les calculs sur des valeurs de taux différentes (si les règles de calcul ne changent pas trop)
// sas 2020
plafond_secu pss 41136,0000 -
calcul salariré employeur
___sécurité_sociale
maladie_maternité T - 13,0000
invalidité_décès
vieillesse_plafonnée P 6,9000 8,5500
vieillesse_déplafonnée T 0,4000 1,9000
allocations_familiales T - 5,2500
accidents_du_travail T - 1,0000
contribution_de_solidarité T - 0,3000
pour_l’autonomie
___cotisation_logement_(fnal)
employeurs_-_50_salariés P - 0,1000
employeurs_+_50_salariés t - 0,5000
assurance_chômage T_<_4 - 4,0500
fonds_de_garantie T_<_4 - 0,1500
des_salaires_(ags)
APEC T_<_4 0,0240 0,0360
___retraite_complémentaire
cotisation_agirc_arrco_1 T 3,1500 4,7200
cotisation_agirc_arrco_2 T_1_8 8,6400 12,9500
contribution_d’équilibre_1 T 0,8600 1,2900
général
contribution_d’équilibre_2 T_1_8 1,0800 1,6200
général
contribution_d’équilibre_3 T_<_8 0,1400 0,1000
technique
prévoyance_cadres P - 1,5000
forfait_social_sur_la f_soc - 8,0000
contribution_patronale
de_prévoyance
contribution_au_financement T - 0,0160
des_organisations_prof
et_syndicales
versement_transport T - -
formation_professionnelle x - 0,575
taxe_apprentissage x - 0,68
CSG_CRDS_non_déductible CSG 2,9000 -
CSG_déductible CSG 6,8000 -
|
2.2 - Calculs La colonne "calcul" indique comment calculer les charges. Le "salaire" est le salaire brut. Le "plafond sécu" est le plafond de la sécurités sociale
Les charges sont calculées en utilisant - T : le salaire total
- P : le salaire ne dépassant pas le plafond de la sécu
- T_<_4 : salaire ne dépassant pas 4 fois le plafond de la sécu
- T_<_8 : salaire ne dépassant pas 8 fois le plafond de la sécu
- T_1_8 : la partie du salaire comprise entre la plafond de la sécu mais ne dépalssant pas 8 fois le plafond
- CSG: la base est 0.9825* 4* (plafond sécu) + montant au delà de 4 plafonds
- t, x, f_soc: nous avons vu ces charges mentionnées mais ne savons pas les calculer
3 - Le Projet Delphi de calcul de charges 3.1 - La classe de calcul Chaque paramètre (une ligne de la table ci-dessus) est défini par Voici la définition de la classe de calcul:
Type c_sas_parameter= // one "sas_parameter"
Class(c_basic_object)
// -- m_name: the key of the parameter
m_policy: String;
m_employee_rate, m_company_rate: Double;
Constructor create_sas_parameter(p_name: String);
Function f_c_self: c_sas_parameter;
Function f_display_sas_parameter: String;
Destructor Destroy; Override;
End; // c_sas_parameter |
et nous définission la classe c_sas_parameter_list_2 qui est une liste de ces paramètres
Les paramètres sont chargés en analysant le fichier .txt des paramètres
Procedure c_sas_parameter_list_2.load_from_file(p_path, p_file_name: String);
Var l_c_parameter_stringlist: c_stringlist;
Function _f_next_value: String;
Var l_value: String; Begin
l_value:= l_c_parameter_stringlist.f_next_value;
If (l_value= '') Or (l_value= '-')
Then Result:= '0'
Else Result:= l_value;
End; // _f_next_value
Var l_key, l_policy, l_employee_value, l_company_value: String;
Begin // load_from_file
l_c_parameter_stringlist:= c_stringlist.create_stringlist('',
p_path, p_file_name);
With l_c_parameter_stringlist Do Begin
stop_if_empty; display(m_c_stringlist.Text);
While Not f_end_of_file Do
Begin display(m_the_line);
If Not f_is_blank_or_comment
Then Begin
l_key:= f_next_value;
l_policy:= f_next_value;
// l_key:= f_replace_character(l_key, '-', '_');
If l_policy= ''
Then l_key:= f_spaces(m_indentation)+ l_key;
l_employee_value:= _f_next_value;
l_company_value:= _f_next_value;
With f_c_add_sas_parameter(l_key) Do
Begin
m_policy:= l_policy;
m_employee_rate:= StrToFloat(l_employee_value);
m_company_rate:= StrToFloat(l_company_value);
End; End
Else
If (m_title= '') And (m_trimmed_line<> '')
Then m_title:= m_trimmed_line
Else
With f_c_add_sas_parameter(m_the_line) Do
If m_trimmed_line= ''
Then m_name:= '';
read_line; End; // while not f_end_of_file
Free; End; // with l_c_parameter_stringlist
display(m_c_sas_parameter_list.Text);
End; // load_from_file |
3.2 - Les calculs La classe qui fait les calculs est
Type c_calcul_charges_sas=
Class(c_basic_object)
m_c_sas_parameter_list_2_ref: c_sas_parameter_list_2;
m_month_count: Integer;
Constructor create_calcul_charges_sas(p_name: String;
p_c_sas_parameter_list_2_ref: c_sas_parameter_list_2);
Procedure compute_charges(p_salary: Double);
Destructor Destroy; Override;
End; // c_calcul_charges_sas | et la procédure de calcul est:
Procedure c_calcul_charges_sas.compute_charges(p_salary: Double);
Var l_total_employee, l_total_company: Double;
l_plafond_secu: Double;
l_prevoyance_pour_csg: Double;
Procedure _display(p_key, p_policy: String;
p_base, p_employee_rate, p_employee_amout, p_company_rate, p_company_amount: Double);
Procedure _format(p_rate, p_value: Double; Var pv_rate, pv_value: String);
Begin
pv_rate:= ''; pv_value:= '';
If p_rate<> 0
Then Begin
pv_rate:= Format('%7.3f', [p_rate]);
pv_value:= Format('%10.2f', [p_value]);
End; End; // _format
Var l_employee_rate, l_employee_amount: String;
l_company_rate, l_company_amount: String;
Begin // _display
_format(p_employee_rate, p_employee_amout, l_employee_rate, l_employee_amount);
_format(p_company_rate, p_company_amount, l_company_rate, l_company_amount);
display(Format('%-27s %-5s %10.2f %7s %10s %7s %10s',
[p_key, p_policy, p_base, l_employee_rate, l_employee_amount,
l_company_rate, l_company_amount]));
l_total_employee:= l_total_employee+ p_employee_amout;
l_total_company:= l_total_company+ p_company_amount;
If p_key= 'prevoyance_cadre'
Then l_prevoyance_pour_csg:= l_prevoyance_pour_csg+ p_company_amount;
End; // _display
Procedure _compute_on_full_salary(p_c_sas_parameter: c_sas_parameter);
Var l_employee_amount, l_company_amount: Double;
Begin With p_c_sas_parameter Do
Begin
l_employee_amount:= p_salary* m_employee_rate/ 100;
l_company_amount:= p_salary* m_company_rate/ 100;
_display(m_name, m_policy, p_salary,
m_employee_rate, l_employee_amount, m_company_rate, l_company_amount);
End; End; // _compute_on_full_salary
Procedure _compute_on_plafond_secu(p_c_sas_parameter: c_sas_parameter);
Var l_base: Double;
l_employee_amount, l_company_amount: Double;
Begin With p_c_sas_parameter Do
Begin
l_base:= Min(l_plafond_secu, p_salary);
l_employee_amount:= l_base* m_employee_rate/ 100;
l_company_amount:= l_base* m_company_rate/ 100;
_display(m_name, m_policy, l_base,
m_employee_rate, l_employee_amount, m_company_rate, l_company_amount);
End; End; // _compute_on_plafond_secu
Procedure _compute_retraite_1_a_8_plafond(p_c_sas_parameter: c_sas_parameter);
Var l_base: Double;
l_employee_amount, l_company_amount: Double;
Begin With p_c_sas_parameter Do
Begin // display(Format('%10.f %10.2f', [p_salary, l_plafond_secu]));
l_base:= Min(l_plafond_secu* 8, p_salary);
// display(Format('%10.f', [l_base]));
l_base:= l_base- l_plafond_secu;
// display(Format('%10.f', [l_base]));
If l_base> 0
Then Begin
l_employee_amount:= l_base* m_employee_rate/ 100;
l_company_amount:= l_base* m_company_rate/ 100;
_display(m_name, m_policy, l_base,
m_employee_rate, l_employee_amount, m_company_rate, l_company_amount);
End; End;
End; // _compute_retraite_1_a_8_plafond
Procedure _compute_on_total_up_to_4_plafond(p_c_sas_parameter: c_sas_parameter);
Var l_base: Double;
l_employee_amount, l_company_amount: Double;
Begin With p_c_sas_parameter Do
Begin
l_base:= Min(p_salary, l_plafond_secu* 4);
l_employee_amount:= l_base* m_employee_rate/ 100;
l_company_amount:= l_base* m_company_rate/ 100;
_display(m_name, m_policy, l_base,
m_employee_rate, l_employee_amount, m_company_rate, l_company_amount);
End; End; // _compute_on_total_up_to_4_plafond
Procedure _compute_on_total_up_to_8_plafond(p_c_sas_parameter: c_sas_parameter);
Var l_base: Double;
l_employee_amount, l_company_amount: Double;
Begin With p_c_sas_parameter Do
Begin
l_base:= Min(p_salary, l_plafond_secu* 8);
l_employee_amount:= l_base* m_employee_rate/ 100;
l_company_amount:= l_base* m_company_rate/ 100;
_display(m_name, m_policy, l_base,
m_employee_rate, l_employee_amount, m_company_rate, l_company_amount);
End; End; // _compute_on_total_up_to_8_plafond
Procedure _compute_on_total_1_to_8_plafond(p_c_sas_parameter: c_sas_parameter);
Var l_base: Double;
l_employee_amount, l_company_amount: Double;
Begin With p_c_sas_parameter Do
Begin
l_base:= Min(p_salary, l_plafond_secu* 8)- l_plafond_secu;
If l_base> 0
Then Begin
l_employee_amount:= l_base* m_employee_rate/ 100;
l_company_amount:= l_base* m_company_rate/ 100;
_display(m_name, m_policy, l_base,
m_employee_rate, l_employee_amount, m_company_rate, l_company_amount);
End; End;
End; // _compute_on_total_1_to_8_plafond
Procedure _compute_csg(p_c_sas_parameter: c_sas_parameter);
Var l_max, l_base: Double;
l_employee_amount: Double; Begin
With p_c_sas_parameter Do
Begin
l_base:= Min(p_salary, l_plafond_secu* 4)* 0.9825;
If p_salary> l_plafond_secu* 4
Then l_base:= l_base+ (p_salary- l_plafond_secu* 4);
l_base:= l_base+ l_prevoyance_pour_csg;
l_employee_amount:= p_salary* m_employee_rate/ 100;
_display(m_name, m_policy, l_base,
m_employee_rate, l_employee_amount, 0, 0);
End; End; // _compute_csg
Var l_sas_parameter_index: Integer;
Begin // compute_charges
l_total_employee:= 0; l_total_company:= 0; l_prevoyance_pour_csg:= 0;
display_line;
display(Format('--- Charges SAS. Salaire %10.2f', [p_salary]));
With m_c_sas_parameter_list_2_ref Do Begin
l_plafond_secu:= f_c_find_sas_parameter_by_name('plafond_secu').m_employee_rate;
For l_sas_parameter_index:= 0 To f_sas_parameter_count- 1 Do
With f_c_sas_parameter(l_sas_parameter_index) Do
If m_policy= 'T'
Then _compute_on_full_salary(f_c_self) Else
If m_policy= 'P'
Then _compute_on_plafond_secu(f_c_self) Else
If m_policy= 'B_1_8'
Then _compute_retraite_1_a_8_plafond(f_c_self) Else
If m_policy= 'T_<_4'
Then _compute_on_total_up_to_4_plafond(f_c_self) Else
If m_policy= 'T_1_8'
Then _compute_on_total_1_to_8_plafond(f_c_self) Else
If m_policy= 'T_<_8'
Then _compute_on_total_up_to_8_plafond(f_c_self) Else
If m_policy= 'CSG'
Then _compute_csg(f_c_self)
Else
If m_policy= ''
Then display_line
Else _display(m_name, m_policy, p_salary, 0, 0, 0, 0);
End; // with m_c_sas_parameter_list_2_ref display_line;
display(Format('total %s %6.2f %10.2f %s %6.2f %10.2f',
[f_spaces(10+ 25), l_total_employee/ p_salary*100, l_total_employee,
f_spaces(1), l_total_company/ p_salary* 100, l_total_company]));
display_line;
display(Format('overall %s %10.2f %10.2f %6.2f',
[f_spaces(3), p_salary,
l_total_employee+ l_total_company,
(l_total_employee+ l_total_company)/ p_salary* 100]));
End; // compute_charges |
4 - Mini How To Voici l'image de l'application
Donc - initialisez le fichier des paramètres. 2020 est fourni dans le .ZIP
- sélectionnez le fichier de paramètres dans la tFileListBox
- entrez le salaire
- soit en cliquant un des trois tRadioButton (< plafond, > plafond, >> plafond)
- soit en saisissant manuellement la valeura qui vous intéress
- cliquez "compute_"
Nous avons utilisé comme exemple une valeur mettant en oeuvre tous les taux.
Nous avons validé les calculs à l'aide d'articles Internet, sans garantie toutefois (ils peuvent se tromper comme nous !)
5 - Améliorations 5.1 - Quelques pistes
- nous n'avons pas traités tous les cas spéciaux (cotisations minimales, départements d'Alsace etc)
5.2 - Liens Quelques liens pour trouver des taux et aussi
6 - Télécharger le code source Delphi
Vous pouvez télécharger: Ce .ZIP qui comprend:
- le .DPR, la forme principale, les formes annexes eventuelles
- les fichiers de paramètres (le schéma et le batch de création)
- dans chaque .ZIP, toutes les librairies nécessaires à chaque projet (chaque .ZIP est autonome)
Ces .ZIP, pour les projets en Delphi 6, contiennent des chemins RELATIFS. Par conséquent: - créez un répertoire n'importe où sur votre machine
- placez le .ZIP dans ce répertoire
- dézippez et les sous-répertoires nécessaires seront créés
- compilez et exécutez
Ces .ZIP ne modifient pas votre PC (pas de changement de la Base de Registre, de DLL ou autre). Pour supprimer le projet, effacez le répertoire.
La notation utilisée est la notation alsacienne qui consiste à préfixer les identificateurs par la zone de compilation: K_onstant, T_ype, G_lobal,
L_ocal, P_arametre, F_unction, C_lasse. Elle est présentée plus en détail dans l'article La
Notation Alsacienne
Comme d'habitude: - nous vous remercions de nous signaler toute erreur, inexactitude ou
problème de téléchargement en envoyant un e-mail à jcolibri@jcolibri.com. Les corrections qui en résulteront pourront aider les prochains lecteurs
- tous vos commentaires, remarques, questions, critiques, suggestion d'article, ou mentions d'autres sources sur le même sujet seront de même les bienvenus à jcolibri@jcolibri.com.
- plus simplement, vous pouvez taper (anonymement ou en fournissant votre e-mail pour une réponse) vos commentaires ci-dessus et nous les envoyer en cliquant "envoyer" :
- et si vous avez apprécié cet article, faites connaître notre site, ajoutez un lien dans vos listes de liens ou citez-nous dans vos
blogs ou réponses sur les messageries. C'est très simple: plus nous aurons de visiteurs et de références Google, plus nous écrirons d'articles.
7 - L'auteur
John COLIBRI est passionné par le développement Delphi et les applications de Bases de Données. Il a écrit de nombreux livres et articles, et partage son temps entre le développement de projets (nouveaux projets, maintenance, audit, migration BDE, migration Xe_n, refactoring) pour ses clients, le
conseil (composants, architecture, test) et la
formation. Son site contient des articles
avec code source, ainsi que le programme et le calendrier des stages de formation Delphi, base de données, programmation objet, Services Web, Tcp/Ip et
UML qu'il anime personellement tous les mois, à Paris, en province ou sur site client. |